package 剑指II;

import 我的JDK基础数据结构.HashMap.HashMap;

import java.util.Map;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-11-02
 **/

public class Jz011_0和1个数相同的子数组 {

    /**
     * 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组，并返回该子数组的长度。
     * <p>
     * 示例 1:
     * 输入: nums = [0,1]
     * 输出: 2
     * 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
     * 示例 2:
     * 输入: nums = [0,1,0]
     * 输出: 2
     * 说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。
     *  
     * 提示：
     * 1 <= nums.length <= 105
     * nums[i] 不是 0 就是 1
     */

    public int findMaxLength(int[] nums) {

        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);

        int result = 0;
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += (nums[i] == 1 ? 1 : -1);
            if (map.containsKey(sum)) {
                result = Math.max(result, i - map.get(sum));
            } else {
                map.put(sum, i);
            }
        }

        return result;
    }

}
